package me.yangzhi.day_12.db;

import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;

import java.util.ArrayList;
import java.util.List;

import me.yangzhi.day_12.model.ChatMessage;

/**
 * SQLite数据库帮助类
 * 负责数据库的创建、升级和聊天消息的增删改查操作
 * 继承自SQLiteOpenHelper，实现数据持久化存储
 */
public class ChatDBHelper extends SQLiteOpenHelper {
    // 数据库名称
    private static final String DATABASE_NAME = "chat.db";
    // 数据库版本号（更改数据库结构时需要更新此版本号）
    private static final int DATABASE_VERSION = 1;
    // 消息表名
    private static final String TABLE_MESSAGES = "messages";

    // 表字段名称定义
    public static final String COLUMN_ID = "id";           // 主键ID
    public static final String COLUMN_MESSAGE = "message";  // 消息内容
    public static final String COLUMN_IS_SENT = "is_sent"; // 消息状态（1=发送，0=接收）
    public static final String COLUMN_TIMESTAMP = "timestamp"; // 时间戳

    // 创建消息表的SQL语句
    private static final String CREATE_TABLE_MESSAGES = 
            "CREATE TABLE " + TABLE_MESSAGES + " (" +
            COLUMN_ID + " INTEGER PRIMARY KEY AUTOINCREMENT, " + // 自增主键
            COLUMN_MESSAGE + " TEXT NOT NULL, " +                // 消息内容，不允许为空
            COLUMN_IS_SENT + " INTEGER NOT NULL, " +            // 消息状态，使用整数存储布尔值
            COLUMN_TIMESTAMP + " INTEGER NOT NULL)";            // 时间戳，使用长整型存储

    /**
     * 构造函数
     * @param context 应用程序上下文
     */
    public ChatDBHelper(Context context) {
        super(context, DATABASE_NAME, null, DATABASE_VERSION);
    }

    /**
     * 首次创建数据库时调用
     * 创建必要的数据表
     * @param db SQLiteDatabase对象
     */
    @Override
    public void onCreate(SQLiteDatabase db) {
        // 执行创建表的SQL语句
        db.execSQL(CREATE_TABLE_MESSAGES);
    }

    /**
     * 数据库升级时调用
     * 当DATABASE_VERSION值增加时，会触发onUpgrade
     * @param db 数据库对象
     * @param oldVersion 旧版本号
     * @param newVersion 新版本号
     */
    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
        // 简单起见，这里采用删除旧表、创建新表的方式升级
        // 实际应用中应该根据版本差异，编写相应的升级脚本
        db.execSQL("DROP TABLE IF EXISTS " + TABLE_MESSAGES);
        onCreate(db);
    }

    /**
     * 添加新消息到数据库
     * @param message 消息内容
     * @param isSent 是否为发送的消息
     * @return 新插入消息的ID
     */
    public long addMessage(String message, boolean isSent) {
        // 获取可写数据库对象
        SQLiteDatabase db = this.getWritableDatabase();
        
        // 准备要插入的数据
        ContentValues values = new ContentValues();
        values.put(COLUMN_MESSAGE, message);
        values.put(COLUMN_IS_SENT, isSent ? 1 : 0);  // 布尔值转换为整数
        values.put(COLUMN_TIMESTAMP, System.currentTimeMillis());
        
        // 插入数据并返回新记录的ID
        return db.insert(TABLE_MESSAGES, null, values);
    }

    /**
     * 获取所有聊天消息
     * @return 消息列表，按时间戳升序排列
     */
    public List<ChatMessage> getAllMessages() {
        List<ChatMessage> messages = new ArrayList<>();
        
        // 获取可读数据库对象
        SQLiteDatabase db = this.getReadableDatabase();
        
        // 查询所有消息，按时间戳升序排列
        Cursor cursor = db.query(TABLE_MESSAGES, null, null, null, null, null, 
                COLUMN_TIMESTAMP + " ASC");

        // 遍历结果集，将数据转换为ChatMessage对象
        if (cursor.moveToFirst()) {
            do {
                ChatMessage message = new ChatMessage(
                    cursor.getLong(cursor.getColumnIndex(COLUMN_ID)),
                    cursor.getString(cursor.getColumnIndex(COLUMN_MESSAGE)),
                    cursor.getInt(cursor.getColumnIndex(COLUMN_IS_SENT)) == 1,
                    cursor.getLong(cursor.getColumnIndex(COLUMN_TIMESTAMP))
                );
                messages.add(message);
            } while (cursor.moveToNext());
        }
        
        // 关闭游标，释放资源
        cursor.close();
        return messages;
    }

    /**
     * 删除指定消息
     * @param messageId 要删除的消息ID
     * @return 是否删除成功
     */
    public boolean deleteMessage(long messageId) {
        // 获取可写数据库对象
        SQLiteDatabase db = this.getWritableDatabase();
        
        // 删除指定ID的消息，返回受影响的行数
        return db.delete(TABLE_MESSAGES, COLUMN_ID + " = ?", 
                new String[]{String.valueOf(messageId)}) > 0;
    }
} 